package ArrayList;

import java.util.Arrays;

public class ArrayList {
	 private int [] elem;
	 private int usedSize;
	 private final int DEFAULT_SIZE=2;
	 public ArrayList() {
		 this.elem=new int [DEFAULT_SIZE];
	 }
	 //指定数组的长度
	 public ArrayList( int initCapacity) {
		 this.elem=new int [initCapacity];
	 }
	 public void display() {
		 for(int i = 0;i<this.elem.length;i++) {
			 System.out.print(this.elem[i]+" ");
		 }
		 System.out.println();
	 }
	 public boolean isFull() {
		 if(this.usedSize==this.elem.length) {
			 return true;
		 }
		 return false;
	 }
	 public  void checkPos(int pos) {
		 if(pos<0||pos>=this.usedSize) {
			 throw new PosOutBoundsException(pos + "位置不合法");
		 }
	 }
	public void add(int data) {
		 if(isFull()) {
			 this.elem=Arrays.copyOf(this.elem,this.elem.length*2);
		 }
		 this.elem[this.usedSize]=data;
		 this.usedSize++;
	}
	// 在 pos 位置新增元素
		public void add(int pos, int data) {
		 if(pos<0||pos>=this.usedSize) {
			 throw new PosOutBoundsException(pos +" 位置不合法");
		 }
		 if(isFull()) {
			 this.elem=Arrays.copyOf(this.elem,this.elem.length*2);
		 }
		 for(int i =this.usedSize-1;i>=pos;i--) {
			 this.elem[i+1]=this.elem[i];
		 }
		 this.elem[pos]=data;
		 this.usedSize++;
		}
	// 判定是否包含某个元素
		public boolean contains(int toFind) {
		 for(int i = 0 ;i<this.usedSize;i++) {
			 if(this.elem[i]==toFind) {
				 return true;
			 }
		 }
		 return false;
	 }
	// 查找某个元素对应的位置
	public int indexOf(int toFind) {
		for(int i = 0 ;i<this.usedSize;i++) {
			if(this.elem[i]==toFind) {
				return i;
			}
		}
		return -1;
	 }
	// 获取 pos 位置的元素
		public int get(int pos) {
		 checkPos(pos);
		 return this.elem[pos];
	 }
	// 给 pos 位置的元素设为 value
		public void set(int pos, int value) {
			checkPos(pos);
			this.elem[pos]=value;
		}
	//删除第一次出现的关键字key
		public void remove(int toRemove) {
		 int index=indexOf(toRemove);
		 if(index==-1) {
			 System.out.println("没有这个数据");
			 return ;
		 }
		 //减一并，否则的话最后那个数据没法进行覆盖
		 for(int i =index;i<=this.usedSize-1;i++) {
			 this.elem[i]=this.elem[i+1];
		 }
		this.usedSize--;
		}	// 获取顺序表长度
		public int size() {
		 return this.usedSize;
	 }
}
